package com.ordersys.cloud.controller;


import cn.hutool.core.util.IdUtil;
import com.ordersys.cloud.apis.PayFeignApi;
import com.ordersys.cloud.apis.ProductFeignApi;
import com.ordersys.cloud.domain.R;
import com.ordersys.cloud.entity.Order;
import com.ordersys.cloud.entity.OrderRequest;
import com.ordersys.cloud.entity.PayDTO;
import com.ordersys.cloud.entity.ProductDTO;
import com.ordersys.cloud.enums.ReturnCodeEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.math.BigDecimal;

import java.util.Date;

@RestController
@RequestMapping("/order")
public class OrderController {
    @Autowired
    PayFeignApi payFeignApi;
    @Autowired
    ProductFeignApi productFeignApi;


    /**
     用户通过订单服务发起订单创建请求。逻辑步骤参考：
     * 1.订单服务调用商品服务验证商品库存。
     * 2.订单服务调用用户服务获取用户信息。
     * 3.订单服务调用商品服务扣减库存。
     * 4.订单服务调用支付服务处理支付。
     * 5.支付服务返回支付状态，订单服务根据结果更新订单状态。
     * */



    @PostMapping("/createOrder")
    public R createOrder(@RequestBody OrderRequest request){
        // =============1 获取商品信息=================
        R productById = productFeignApi.getProductById(request.getProductId());
        String productByIdCode = productById.getCode();
        ProductDTO product;
        if ("200".equals(productByIdCode)){
             product= (ProductDTO) productById.getData();
        }else {
            return R.fail(ReturnCodeEnum.BUSINESS_ERROR,"商品不存在");
        }

        if (product.getStock()<request.getQuantity()){
           return R.fail(ReturnCodeEnum.BUSINESS_ERROR,"库存不足");
        }

        //   ====2 获取用户信息===自己实现=============


        //=====================3 扣减商品库存=====================
        Integer i = productFeignApi.reduceStock(request.getProductId(), request.getQuantity());
        //本地内存减掉库存
        product.setStock(product.getStock()-request.getQuantity());

        //========== 4  创建支付===========
        PayDTO payDTO = new PayDTO();
        //用户id
        payDTO.setUserId(request.getUserId());
        //支付流水
        String payNo = IdUtil.simpleUUID();
        payDTO.setPayNo(payNo);
        //生成订单号订单号 : 时间戳   （注：生产环境不能用这种方式）
        Date date = new Date();
        long dateTime = date.getTime();//时间戳
        Long orderId = dateTime;//利用时间戳作为订单号
        payDTO.setOrderNo(orderId+"");
        //订单金额：  单价 *数量  （保留2位小数）
         payDTO.setAmount(product.getPrice().multiply(new BigDecimal(request.getQuantity())).setScale(2,BigDecimal.ROUND_DOWN));
        R r = payFeignApi.addPay(payDTO);
       Integer payId = (Integer) r.getData();
       if (payId!=null){
           payDTO.setId(payId);
       }
        //支付服务返回支付状态，订单服务根据结果更新订单状态。
        String code = r.getCode();

        //=======5.创建订单实例===========
        Order order = new Order();
        order.setId(orderId);
        order.setProduct(product);
        order.setPayDTO(payDTO);
        if ("200".equals(code)){//支付成功
            order.setStatus("Y");
        }else {
            //支付失败
            order.setStatus("N");
        }
        return R.ok(order, "订单状态："+order.getStatus());
     }


     @GetMapping("/test")
     public R test(){
        return R.ok("测试成功");
     }

}
